/**
 * @fileoverview 日志工具
 * @description 提供统一的日志记录功能
 */

const Storage = require('./storage')

// 日志级别
const LOG_LEVELS = {
  DEBUG: 0,
  INFO: 1,
  WARN: 2,
  ERROR: 3
}

// 日志级别名称
const LOG_LEVEL_NAMES = ['DEBUG', 'INFO', 'WARN', 'ERROR']

class Logger {
  constructor() {
    this.level = LOG_LEVELS.INFO // 默认日志级别
    this.maxLogs = 1000 // 最大保存日志条数
    this.enableConsole = true // 是否输出到控制台
    this.enableStorage = true // 是否保存到本地存储
  }

  /**
   * 设置日志级别
   * @param {number} level - 日志级别
   */
  setLevel(level) {
    this.level = level
  }

  /**
   * 格式化日志信息
   * @param {number} level - 日志级别
   * @param {string} message - 日志消息
   * @param {*} data - 附加数据
   */
  formatLog(level, message, data) {
    const timestamp = new Date().toISOString()
    const levelName = LOG_LEVEL_NAMES[level]
    
    return {
      timestamp,
      level: levelName,
      message,
      data,
      page: this.getCurrentPage(),
      userAgent: this.getUserAgent()
    }
  }

  /**
   * 获取当前页面路径
   */
  getCurrentPage() {
    try {
      const pages = getCurrentPages()
      const currentPage = pages[pages.length - 1]
      return currentPage ? currentPage.route : 'unknown'
    } catch (error) {
      return 'unknown'
    }
  }

  /**
   * 获取用户代理信息
   */
  getUserAgent() {
    try {
      const systemInfo = wx.getSystemInfoSync()
      return {
        platform: systemInfo.platform,
        system: systemInfo.system,
        version: systemInfo.version,
        model: systemInfo.model
      }
    } catch (error) {
      return null
    }
  }

  /**
   * 记录日志
   * @param {number} level - 日志级别
   * @param {string} message - 日志消息
   * @param {*} data - 附加数据
   */
  log(level, message, data) {
    if (level < this.level) {
      return
    }

    const logData = this.formatLog(level, message, data)

    // 输出到控制台
    if (this.enableConsole) {
      this.outputToConsole(level, logData)
    }

    // 保存到本地存储
    if (this.enableStorage) {
      this.saveToStorage(logData)
    }
  }

  /**
   * 输出到控制台
   * @param {number} level - 日志级别
   * @param {Object} logData - 日志数据
   */
  outputToConsole(level, logData) {
    const { timestamp, level: levelName, message, data } = logData
    const prefix = `[${timestamp}] [${levelName}]`

    switch (level) {
      case LOG_LEVELS.DEBUG:
        console.debug(prefix, message, data)
        break
      case LOG_LEVELS.INFO:
        console.info(prefix, message, data)
        break
      case LOG_LEVELS.WARN:
        console.warn(prefix, message, data)
        break
      case LOG_LEVELS.ERROR:
        console.error(prefix, message, data)
        break
    }
  }

  /**
   * 保存到本地存储
   * @param {Object} logData - 日志数据
   */
  saveToStorage(logData) {
    try {
      let logs = Storage.get('app_logs', [])
      
      logs.push(logData)
      
      // 限制日志数量
      if (logs.length > this.maxLogs) {
        logs = logs.slice(-this.maxLogs)
      }
      
      Storage.set('app_logs', logs)
    } catch (error) {
      console.error('Failed to save log to storage:', error)
    }
  }

  /**
   * 获取存储的日志
   * @param {number} limit - 限制数量
   * @param {number} level - 过滤级别
   */
  getLogs(limit = 100, level = null) {
    try {
      let logs = Storage.get('app_logs', [])
      
      // 按级别过滤
      if (level !== null) {
        logs = logs.filter(log => LOG_LEVELS[log.level] >= level)
      }
      
      // 限制数量（取最新的）
      if (limit > 0) {
        logs = logs.slice(-limit)
      }
      
      return logs
    } catch (error) {
      console.error('Failed to get logs from storage:', error)
      return []
    }
  }

  /**
   * 清除存储的日志
   */
  clearLogs() {
    try {
      Storage.remove('app_logs')
      return true
    } catch (error) {
      console.error('Failed to clear logs:', error)
      return false
    }
  }

  /**
   * 导出日志
   */
  exportLogs() {
    const logs = this.getLogs()
    const logText = logs.map(log => {
      const { timestamp, level, message, data, page } = log
      let line = `${timestamp} [${level}] [${page}] ${message}`
      
      if (data) {
        line += ` ${JSON.stringify(data)}`
      }
      
      return line
    }).join('\n')
    
    return logText
  }

  /**
   * Debug 日志
   * @param {string} message - 日志消息
   * @param {*} data - 附加数据
   */
  debug(message, data) {
    this.log(LOG_LEVELS.DEBUG, message, data)
  }

  /**
   * Info 日志
   * @param {string} message - 日志消息
   * @param {*} data - 附加数据
   */
  info(message, data) {
    this.log(LOG_LEVELS.INFO, message, data)
  }

  /**
   * Warning 日志
   * @param {string} message - 日志消息
   * @param {*} data - 附加数据
   */
  warn(message, data) {
    this.log(LOG_LEVELS.WARN, message, data)
  }

  /**
   * Error 日志
   * @param {string} message - 日志消息
   * @param {*} data - 附加数据
   */
  error(message, data) {
    this.log(LOG_LEVELS.ERROR, message, data)
  }

  /**
   * 记录用户行为
   * @param {string} action - 行为名称
   * @param {Object} params - 行为参数
   */
  trackAction(action, params = {}) {
    this.info(`User action: ${action}`, {
      action,
      params,
      timestamp: Date.now()
    })
  }

  /**
   * 记录页面访问
   * @param {string} page - 页面路径
   * @param {Object} params - 页面参数
   */
  trackPageView(page, params = {}) {
    this.info(`Page view: ${page}`, {
      page,
      params,
      timestamp: Date.now()
    })
  }

  /**
   * 记录API调用
   * @param {string} api - API路径
   * @param {Object} request - 请求参数
   * @param {Object} response - 响应数据
   * @param {number} duration - 耗时（毫秒）
   */
  trackApiCall(api, request, response, duration) {
    const success = !response.error
    const level = success ? LOG_LEVELS.INFO : LOG_LEVELS.ERROR
    
    this.log(level, `API call: ${api}`, {
      api,
      request,
      response,
      duration,
      success,
      timestamp: Date.now()
    })
  }

  /**
   * 记录错误
   * @param {Error} error - 错误对象
   * @param {string} context - 错误上下文
   */
  trackError(error, context = '') {
    this.error(`Error occurred: ${error.message}`, {
      name: error.name,
      message: error.message,
      stack: error.stack,
      context,
      timestamp: Date.now()
    })
  }

  /**
   * 记录性能指标
   * @param {string} metric - 指标名称
   * @param {number} value - 指标值
   * @param {Object} extra - 额外信息
   */
  trackPerformance(metric, value, extra = {}) {
    this.info(`Performance metric: ${metric}`, {
      metric,
      value,
      extra,
      timestamp: Date.now()
    })
  }
}

// 创建全局实例
const logger = new Logger()

// 设置开发环境的日志级别（兼容微信小程序环境）
const isDev = (typeof __DEV__ !== 'undefined' && __DEV__) || (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development');
if (isDev) {
  logger.setLevel(LOG_LEVELS.DEBUG)
}

module.exports = logger
